﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace YougeBookmark.Models
{
    /// <summary>
    /// 书签核心数据模型（对应数据库bookmarks表）
    /// </summary>
    public class Bookmark
    {
        private string _url;
        private DateTime _createdTime;

        /// <summary>
        /// 初始化书签实例（自动设置创建时间）
        /// </summary>
        public Bookmark()
        {
            BookmarkTags = new List<BookmarkTag>();
            _createdTime = DateTime.Now;
        }

        /// <summary>
        /// 数据库主键（自增长）
        /// </summary>
        [Key]
        public int Id { get; set; }

        /// <summary>
        /// 完整URL地址
        /// 设置时自动格式化：
        /// 1. 去除首尾空格
        /// 2. 自动添加http前缀
        /// </summary>
        /// <exception cref="UriFormatException">URL格式无效时抛出</exception>
        public string Url
        {
            get => _url;
            set
            {
                var formatted = FormatUrl(value?.Trim());
                if (!IsValidUrl(formatted))
                    throw new UriFormatException("无效的URL格式");
                _url = formatted;
            }
        }

        /// <summary>
        /// 用户备注说明（允许空值，最大长度500字符）
        /// </summary>
        [MaxLength(500)]
        public string Remark { get; set; }

        /// <summary>
        /// 记录创建时间（UTC时间，禁止修改）
        /// </summary>
        public DateTime CreatedTime
        {
            get => _createdTime;
            private set => _createdTime = value.ToUniversalTime();
        }

        /// <summary>
        /// 标签关联集合（通过中间表实现多对多关系）
        /// 包含以下扩展信息：
        /// 1. 关联备注
        /// 2. 关联时间
        /// </summary>
        public virtual ICollection<BookmarkTag> BookmarkTags { get; set; }

        /// <summary>
        /// 添加标签关联（支持批量操作）
        /// </summary>
        /// <param name="tag">要关联的标签对象</param>
        /// <param name="relationRemark">关联备注说明</param>
        public void AddTag(Tag tag, string relationRemark = null)
        {
            if (tag == null) return;

            // 防止重复添加相同标签
            if (!ContainsTag(tag.Id))
            {
                BookmarkTags.Add(new BookmarkTag
                {
                    TagId = tag.Id,
                    BookmarkId = this.Id,
                    Remark = relationRemark,
                    CreatedTime = DateTime.UtcNow
                });
            }
        }

        /// <summary>
        /// 移除指定标签关联
        /// </summary>
        public bool RemoveTag(int tagId)
        {
            var item = BookmarkTags.FirstOrDefault(bt => bt.TagId == tagId);
            return item != null && BookmarkTags.Remove(item);
        }

        /// <summary>
        /// 检查是否包含指定标签
        /// </summary>
        public bool ContainsTag(int tagId)
        {
            return BookmarkTags.Any(bt => bt.TagId == tagId);
        }

        #region 静态工具方法
        /// <summary>
        /// URL格式验证（支持http/https/ftp协议）
        /// </summary>
        public static bool IsValidUrl(string url)
        {
            if (string.IsNullOrWhiteSpace(url)) return false;

            return Regex.IsMatch(url,
                @"^(https?|ftp)://[^\s/$.?#].[^\s]*$",
                RegexOptions.IgnoreCase);
        }

        /// <summary>
        /// URL自动格式化（补全协议前缀）
        /// </summary>
        public static string FormatUrl(string url)
        {
            if (string.IsNullOrWhiteSpace(url)) return url;

            // 自动添加http协议
            if (!url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) &&
                !url.StartsWith("https://", StringComparison.OrdinalIgnoreCase) &&
                !url.StartsWith("ftp://", StringComparison.OrdinalIgnoreCase))
            {
                return "http://" + url;
            }
            return url;
        }
        #endregion
    }
}